'use strict';

import { app, protocol, BrowserWindow, ipcMain, nativeTheme } from 'electron';
import { createProtocol } from 'vue-cli-plugin-electron-builder/lib';
import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer';
const isDevelopment = process.env.NODE_ENV !== 'production';

// 必须在应用程序准备好之前注册方案
// Scheme must be registered before the app is ready
protocol.registerSchemesAsPrivileged([
    {
        scheme: 'app',
        privileges: {
            secure: true,
            standard: true,
        },
    },
]);

async function createWindow() {
    // 创建浏览器窗口。
    // Create the browser window.
    const win = new BrowserWindow({
        width: 1200,
        height: 960,
        webPreferences: {
            // 使用 pluginOptions.nodeIntegration，不要管它
            // 有关更多信息，请参阅 nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration
            // Use pluginOptions.nodeIntegration, leave this alone
            // See nklayman.github.io/vue-cli-plugin-electron-builder/guide/security.html#node-integration for more info
            nodeIntegration: process.env.ELECTRON_NODE_INTEGRATION, // 是否启用Node integration.
            contextIsolation: !process.env.ELECTRON_NODE_INTEGRATION, // 是否在独立 JavaScript 环境中运行 Electron API和指定的preload 脚本
            fullscreen: true, // 窗口是否全屏. 当明确设置为 false 时，在 macOS 上全屏的按钮将被隐藏或禁用
            skipTaskbar: false, // 是否在任务栏中显示窗口
            fullscreenable: true, // 窗口是否可以进入全屏状态. 在 macOS上, 最大化/缩放按钮是否可用
            simpleFullscreen: true, // 在 macOS 上使用 pre-Lion 全屏
            webSecurity: false, // 取消跨域限制
            icon: `${__static}/app.ico`, // 窗口的图标
            enableRemoteModule: true, // 这里是关键设置
        },
    });

    // win.maximize(); // 经在 win10 系统测试，此方法全屏时不能挡住下方任务栏
    // win.setFullScreen(true); // 此方法可以挡住下方任务栏
    win.setMenu(null); // 去掉窗口顶部菜单

    if (process.env.WEBPACK_DEV_SERVER_URL) {
        // 如果处于开发模式，则加载开发服务器的 url
        // Load the url of the dev server if in development mode
        await win.loadURL(process.env.WEBPACK_DEV_SERVER_URL);
        if (!process.env.IS_TEST) win.webContents.openDevTools();
    } else {
        createProtocol('app');
        // 不在开发中时加载 index.html
        // Load the index.html when not in development
        win.loadURL('app://./index.html');
    }
}

// 当所有窗口都关闭时退出。
// Quit when all windows are closed.
app.on('window-all-closed', () => {
    // 在 macOS 上，应用程序及其菜单栏很常见
    // 保持活动状态直到用户使用 Cmd + Q 明确退出
    // On macOS it is common for applications and their menu bar
    // to stay active until the user quits explicitly with Cmd + Q
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

app.on('activate', () => {
    // 在 macOS 上，在应用程序中重新创建一个窗口是很常见的，当
    // 单击停靠图标并且没有其他窗口打开。
    // On macOS it's common to re-create a window in the app when the
    // dock icon is clicked and there are no other windows open.
    if (BrowserWindow.getAllWindows().length === 0) createWindow();
});

// 当 Electron 完成时将调用此方法
// 初始化并准备好创建浏览器窗口。
// 部分API只有在该事件发生后才能使用。
// This method will be called when Electron has finished
// initialization and is ready to create browser windows.
// Some APIs can only be used after this event occurs.
app.on('ready', async () => {
    if (isDevelopment && !process.env.IS_TEST) {
        // 安装 Vue 开发工具
        // Install Vue Devtools
        try {
            await installExtension(VUEJS_DEVTOOLS);
        } catch (e) {
            console.error('Vue Devtools failed to install:', e.toString());
        }
    }
    createWindow();
});

// 主题色判断
ipcMain.handle('dark-mode:toggle', () => {
    if (nativeTheme.shouldUseDarkColors) {
        nativeTheme.themeSource = 'light';
    } else {
        nativeTheme.themeSource = 'dark';
    }
    return nativeTheme.shouldUseDarkColors;
});
ipcMain.handle('dark-mode:system', () => {
    nativeTheme.themeSource = 'system';
});

// 在开发模式下根据父进程的请求干净地退出。
// Exit cleanly on request from parent process in development mode.
if (isDevelopment) {
    if (process.platform === 'win32') {
        process.on('message', data => {
            if (data === 'graceful-exit') {
                app.quit();
            }
        });
    } else {
        process.on('SIGTERM', () => {
            app.quit();
        });
    }
}
